package com.boxuegu.controller;

import com.boxuegu.domain.Card;
import com.boxuegu.entry.MetroLineSystemEntry;
import com.boxuegu.service.CardService;

import java.io.IOException;
import java.util.Scanner;
import java.util.regex.Pattern;

public class CardController {

    CardService cardService = new CardService();
    static Scanner sc = new Scanner(System.in);


    public void start() throws IOException {
         Scanner sc = new Scanner(System.in);
         CardService cardService = new CardService();
            Lo:
            while (true) {
                System.out.println("----------------欢迎来到地铁卡办理界面----------------");
                System.out.println("请输入您的选择： 1.注册用户  2.查询用户  3.注销用户  4.返回上一层");
                String choice = sc.next();
                switch (choice) {
                    case "1":
                        //注册用户
                        addUser();
                        break;
                    case "2":
                        //查询用户
                        findAllCard();
                        break;
                    case "3":
                        //注销用户
                        deleteCardById();
                        break Lo;
                    case "4":
                        //返回上一层
                        break Lo;
                    default:
                        System.out.println("您的输入有误，请重新输入");
                        break;
                }
            }

        }

        //删除用户
        private void deleteCardById() throws IOException {
            String delId;
            while (true) {
                //接收用户信息，并对id进行判断
                System.out.println("请输入要删除的用户卡号:(不想删除请输入F（不区分大小写）");
                delId = sc.next();
                if (!delId.equalsIgnoreCase("F")) {
                    boolean exist = cardService.isExists(delId);
                    if (exist) {
                        //将存在的id传给业务员来进行删除
                        cardService.deleteCardById(delId);
                        //输出提示信息
                        System.out.println("删除成功");
                        break;
                    } else {
                        System.out.println("您输入的卡号不存在，请重新输入");
                    }
                } else {
                    break;
                }

            }


        }

            //注册用户
            //注册用户
            public void addUser() throws IOException {
                Card card = new Card();
                String userId;//接收用户输入的地铁卡号
                System.out.println("请确认是否注册。Y/N（不区分大小写）");
                String choice = sc.next();
                if (choice.equalsIgnoreCase("Y")) {
                    //接收用户信息，并对id进行判断
                    System.out.println("请输入自定义卡号：（长度5位，首字母小写，后四位数字");

                    //这个循环是用来判断id是否符合要求
                    while (true) {
                        userId = sc.next();
                        //创建正则表达式，用以判断字符串是否是数字
                        Pattern compile = Pattern.compile("[0-9]*");

                        if (userId.length() != 5) {
                            System.out.println("您的输入有误，请重新输入。卡号的长度为5");

                        } else if (!(userId.charAt(0) >= 'a' && userId.charAt(0) <= 'z')) {
                            System.out.println("您的输入有误，请重新输入。请以小写字母开头");

                        } else if (!(compile.matcher(userId.substring(1, 5)).matches())) {
                            System.out.println("您的输入有误，请重新输入。后四位必须是数字");
                        } else if (cardService.isExists(userId)) {
                            System.out.println("您输入的卡号已存在，请重新输入");
                        } else {
                            break;
                        }
                    }
                    System.out.println("请输入用户姓名：");
                    String userName = sc.next();
                    System.out.println("请输入您需要充值的金额（最低20元）：");
                    double cardBalance;

                    //判断充值金额是否符合，符合将信息封装，返回添加成功信息，不符合继续输入
                    while (true) {
                        cardBalance = sc.nextDouble();
                        if (cardBalance >= 20) {
                            //封装信息
                            card.setUserId(userId);
                            card.setUserName(userName);
                            card.setCardBalance(cardBalance);

                            //将封装后的地铁卡信息传给业务员中添加方法并返回结果
                            boolean flag = cardService.addUser(card);

                            //打印是否成功、失败
                            if (flag) {
                                //true
                                System.out.println("注册成功，请保存好您的卡号信息");
                                System.out.println(card);
                            } else {
                                System.out.println("注册失败");
                            }
                            break;
                        } else {
                            System.out.println("您输入金额是" + cardBalance + "元，距最小充值金额还差" + (20 - cardBalance) + "元。" +
                                    "请重新输入：");
                        }
                    }
                } else if (choice.equalsIgnoreCase("N")) {
                    System.out.println("您取消了注册。");
                }


            }

                //查询用户
                //查询用户
                private void findAllCard() throws IOException {
                    //调用业务员中的findAllCard获得数组
                    Card[] cards = cardService.findAllCard();
                    //判断其内存地址是否为null
                    if (cards == null) {
                        System.out.println("您查询的信息不存在，请添加后重试");
                        return;
                    }
                    //遍历并进行打印地铁卡用户信息
                    System.out.println("姓名\t地铁卡号\t卡内余额");
                    for (int i = 0; i < cards.length; i++) {
                        Card card = cards[i];
                        //如果地铁卡信息不是null则进行打印
                        System.out.println(card.getUserName() + "\t" + card.getUserId() + "\t"
                                + card.getCardBalance());

                    }

                }


    //充值地铁卡
    public void rechargeCard() throws IOException {
        String recId;
        //接收用户地铁卡号
        lo:
        while (true) {
            //接收用户信息，并对id进行判断
            System.out.println("请输入要充值的用户卡号:(不想充值请输入F（不区分大小写）");
            recId = sc.next();
            if (!recId.equalsIgnoreCase("F")) {
                boolean exist = cardService.isExists(recId);
                if (exist) {
                    //根据id查找剩余额
                    double balance = cardService.cardBalance(recId);
                    System.out.println("您的余额为" + balance + "元");
                    System.out.println("请输入您要充值的的金额（最低为20元）");
                    while (true) {
                        //需要充值的金额
                        double money = sc.nextDouble();
                        if (money >= 20) {
                            //充值后卡内余额剩余
                            double total = balance + money;
                            //将进行充值的id、充值后的总额传给业务员做数据替换
                            cardService.totalRechargeCard(recId, total);
                            System.out.println("充值成功，您的余额为" + total + "元");
                            break lo;
                        } else {
                            System.out.println("您输入的金额小于最小金额，请重新输入");
                        }
                    }
                } else {
                    System.out.println("您的输入卡号有误，请重新输入");
                }
            } else {
                //终止循环
                break;
            }

        }
    }

}